package com.github;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;

import java.util.Collections;

/**
 * 代码自动生成器 (新版API)
 *
 * @author fatfish
 * @version 2.0
 * &#064;date  2025/8/12 14:13
 */
public class WskCode {
    public static void main(String[] args) {
        // 获取当前项目路径
        String projectPath = System.getProperty("user.dir");

        // 1. 创建代码生成器
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/ljl_test?useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8", "root", "root")

                // 2. 全局配置
                .globalConfig(builder -> {
                    builder.author("ljl") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件 (如果您不希望覆盖，请注释掉此行)
                            .outputDir(projectPath + "/src/main/java") // 指定输出目录
                            .dateType(DateType.ONLY_DATE); // 时间类型策略
                })

                // 3. 包配置
                .packageConfig(builder -> {
                    builder.parent("com.github") // 设置父包名
                            .moduleName("oldCodeAutoGenerator") // 设置父包模块名
                            .entity("pojo") // 实体类包名
                            .service("service") // Service 包名
                            .serviceImpl("service.impl") // Service Impl 包名
                            .mapper("mapper") // Mapper 包名
                            .controller("controller") // Controller 包名
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, projectPath + "/src/main/resources/mapper")); // 设置mapperXml生成路径
                })

                // 4. 策略配置
                .strategyConfig(builder -> {
                    builder.addInclude("user") // 设置需要生成的表名
                            .addTablePrefix("t_", "c_") // 设置过滤表前缀

                            // --- Entity 策略配置 ---
                            .entityBuilder()
                            .enableLombok() // 开启 Lombok
                            .naming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略: 下划线转驼峰
                            .columnNaming(NamingStrategy.underline_to_camel) // 数据库表字段映射到实体的命名策略: 下划线转驼峰
                            .logicDeleteColumnName("deleted") // 逻辑删除字段名
                            .versionColumnName("version") // 乐观锁字段名
                            .addTableFills(new Column("create_time", FieldFill.INSERT)) // 添加创建时自动填充
                            .addTableFills(new Column("update_time", FieldFill.INSERT_UPDATE)) // 添加创建和更新时自动填充

                            // --- Mapper 策略配置 ---
                            .mapperBuilder()
                            .enableMapperAnnotation() // 开启 @Mapper 注解

                            // --- Service 策略配置 ---
                            .serviceBuilder()
                            .formatServiceFileName("%sService") // 去掉 Service 接口的 "I" 前缀

                            // --- Controller 策略配置 ---
                            .controllerBuilder()
                            .enableRestStyle() // 开启 @RestController
                            .enableHyphenStyle(); // URL 中驼峰转连字符 (e.g. /helloWorld -> /hello-world)
                })

                // 5. 使用 Freemarker 模板引擎
                .templateEngine(new FreemarkerTemplateEngine())

                // 6. 执行
                .execute();
    }
}